package com.jgzx.utils;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.jgzx.common.R;
import com.jgzx.domain.PriceTaxRateNumVO;
import com.jgzx.exception.BizException;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

/**
 * 价格处理相关工具类【强制使用BigDecimal】
 * 四舍五入保留4位小数处理
 * @author libo
 * @date 2021/6/17 13:42
 */
@Component
public class PriceTaxRateNumCalc {

    /* ------------------------- 业务整体价格计算--------------------------*/
    /**
     * 通过[无税单价、数量、税率] 计算 [含税单价、无税金额、含税金额、税额]
     * 公式：
     * -------------------------------------------------
     * -- 含税单价 = 无税单价 * (1 + 税率) -> 保留六位小数  --
     * -- 无税金额 = 无税单价 * 数量 -> 保留六位小数        --
     * -- 含税金额 = 含税单价 * 数量 -> 保留六位小数        --
     * -- 税额 = 无税金额 * 税率                         --
     * -------------------------------------------------
     * @param priceTaxRateNumVO 价格信息VO
     */
    public void calcAmountByOrigPrice(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getOrig_price())) {
            throw new BizException("单价不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        priceTaxRateNumVO.setTax_price(calcTaxPriceByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getTax_rate()));
        priceTaxRateNumVO.setOrig_amount(calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax_amount(calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax(calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate()));
    }

    /**
     * 通过[含税单价、数量、税率] 计算 [无税单价、无税金额、含税金额、税额]
     * 公式：
     * -------------------------------------------------
     * -- 无税单价 = 含税单价 / (1 + 税率) -> 保留六位小数  --
     * -- 无税金额 = 无税单价 * 数量 -> 保留六位小数        --
     * -- 含税金额 = 含税单价 * 数量 -> 保留六位小数        --
     * -- 税额 = 无税金额 * 税率                         --
     * -------------------------------------------------
     * @param priceTaxRateNumVO 价格信息VO
     */
    public void calcAmountByTaxPrice(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_price())) {
            throw new BizException("单价不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        priceTaxRateNumVO.setOrig_price(calcOrigPriceByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getTax_rate()));
        priceTaxRateNumVO.setOrig_amount(calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax_amount(calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax(calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate()));
    }

    /**
     * 通过[无税金额、数量、税率] 计算 [无税单价、含税单价、含税金额、税额]
     * 公式：
     * -------------------------------------------------
     * -- 无税单价 = 无税金额 / 数量 -> 保留六位小数        --
     * -- 含税单价 = 无税单价 * (1 + 税率) -> 保留六位小数  --
     * -- 含税金额 = 含税单价 * 数量 -> 保留六位小数        --
     * -- 税额 = 无税金额 * 税率                         --
     * -------------------------------------------------
     * @param priceTaxRateNumVO 价格信息VO
     */
    public void calcPriceByOrigAmount(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getOrig_amount())) {
            throw new BizException("无税金额不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        priceTaxRateNumVO.setOrig_price(calcOrigPriceByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax_price(calcTaxPriceByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getTax_rate()));
        priceTaxRateNumVO.setTax_amount(calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax(calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate()));
    }

    /**
     * 通过[含税金额、数量、税率] 计算 [含税单价、无税单价、无税金额、税额]
     * 公式：
     * -------------------------------------------------
     * -- 含税单价 = 含税金额 / 数量 -> 保留六位小数        --
     * -- 无税单价 = 含税单价 / (1 + 税率) -> 保留六位小数  --
     * -- 无税金额 = 无税单价 * 数量 -> 保留六位小数        --
     * -- 税额 = 无税金额 * 税率                         --
     * -------------------------------------------------
     * @param priceTaxRateNumVO 价格信息VO
     */
    public void calcPriceByTaxAmount(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_amount())) {
            throw new BizException("含税金额不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        priceTaxRateNumVO.setTax_price(calcTaxPriceByTaxAmount(priceTaxRateNumVO.getTax_amount(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setOrig_price(calcOrigPriceByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getTax_rate()));
        priceTaxRateNumVO.setOrig_amount(calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax(calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate()));
    }

    /**
     * 通过[换算系数、辅助无税单价、辅助数量、税率] 计算 [主数量、含税单价、无税单价、无税金额、价税合计、税额]
     * 公式：
     * --------------------------------------------------
     * -- 无税单价 = 辅助无税单价 / 换算系数 -> 保留六位小数  --
     * -- 主数量 = 辅助数量 * 换算系数                     --
     * -- 无税金额 = 无税单价 * 数量 -> 保留六位小数         --
     * -- 含税单价 = 无税单价 * (1 + 税率) -> 保留六位小数   --
     * -- 含税金额 = 含税单价 * 数量 -> 保留六位小数         --
     * -- 税额 = 无税金额 * 税率                          --
     * --------------------------------------------------
     * @param priceTaxRateNumVO 价格信息VO
     */
    public void calcPriceByScalefactor(PriceTaxRateNumVO priceTaxRateNumVO) {
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getScalefactor()) || NumberUtil.equals(priceTaxRateNumVO.getScalefactor(), BigDecimal.ZERO)) {
            throw new BizException("换算系数不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getF_orig_price())) {
            throw new BizException("单价不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getF_num())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        priceTaxRateNumVO.setOrig_price(calcOrigPriceByScalefactor(priceTaxRateNumVO.getF_orig_price(), priceTaxRateNumVO.getScalefactor()));
        priceTaxRateNumVO.setNnum(calcNnumByScalefactor(priceTaxRateNumVO.getF_num(), priceTaxRateNumVO.getScalefactor()));
        priceTaxRateNumVO.setOrig_amount(calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax_price(calcTaxPriceByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getTax_rate()));
        priceTaxRateNumVO.setTax_amount(calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum()));
        priceTaxRateNumVO.setTax(calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate()));
    }

    /**
     * 通过[无税单价、数量、税率] 校验 [含税单价、无税金额、含税金额、税额]
     * @param priceTaxRateNumVO 价格信息VO【无税单价、数量、税率不能为空】
     * @return R
     */
    public R checkAmountByOrigPrice(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getOrig_price())) {
            throw new BizException("单价不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        BigDecimal calcTaxPrice = calcTaxPriceByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTaxPrice, priceTaxRateNumVO.getTax_price())) {
            return R.fail("含税单价计算有误：" + "计算值[" + calcTaxPrice + "]" + "实际值[" + priceTaxRateNumVO.getTax_price() + "]");
        }
        BigDecimal calcOrigAmount = calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcOrigAmount, priceTaxRateNumVO.getOrig_amount())) {
            return R.fail("无税金额计算有误：" + "计算值[" + calcOrigAmount + "]" + "实际值[" + priceTaxRateNumVO.getOrig_amount() + "]");
        }
        BigDecimal calcTaxAmount = calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcTaxAmount, priceTaxRateNumVO.getTax_amount())) {
            return R.fail("含税金额计算有误：" + "计算值[" + calcTaxAmount + "]" + "实际值[" + priceTaxRateNumVO.getTax_amount() + "]");
        }
        BigDecimal calcTax = calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTax, priceTaxRateNumVO.getTax())) {
            return R.fail("税额计算有误：" + "计算值[" + calcTax + "]" + "实际值[" + priceTaxRateNumVO.getTax() + "]");
        }
        return R.ok();
    }

    /**
     * 通过[含税单价、数量、税率] 计算 [无税单价、无税金额、含税金额、税额]
     * @param priceTaxRateNumVO 价格信息VO【含税单价、数量、税率不能为空】
     * @return R
     */
    public R checkAmountByTaxPrice(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_price())) {
            throw new BizException("单价不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        BigDecimal calcOrigPrice = calcOrigPriceByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcOrigPrice, priceTaxRateNumVO.getOrig_price())) {
            return R.fail("无税单价计算有误：" + "计算值[" + calcOrigPrice + "]" + "实际值[" + priceTaxRateNumVO.getOrig_price() + "]");
        }
        BigDecimal calcOrigAmount = calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcOrigAmount, priceTaxRateNumVO.getOrig_amount())) {
            return R.fail("无税金额计算有误：" + "计算值[" + calcOrigAmount + "]" + "实际值[" + priceTaxRateNumVO.getOrig_amount() + "]");
        }
        BigDecimal calcTaxAmount = calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcTaxAmount, priceTaxRateNumVO.getTax_amount())) {
            return R.fail("含税金额计算有误：" + "计算值[" + calcTaxAmount + "]" + "实际值[" + priceTaxRateNumVO.getTax_amount() + "]");
        }
        BigDecimal calcTax = calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTax, priceTaxRateNumVO.getTax())) {
            return R.fail("税额计算有误：" + "计算值[" + calcTax + "]" + "实际值[" + priceTaxRateNumVO.getTax() + "]");
        }
        return R.ok();
    }

    /**
     * 通过[无税金额、数量、税率] 校验 [无税单价、含税单价、含税金额、税额]
     * @param priceTaxRateNumVO 价格信息VO【无税金额、数量、税率不能为空】
     * @return R
     */
    public R checkPriceByOrigAmount(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getOrig_amount())) {
            throw new BizException("无税金额不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        BigDecimal calcOrigPrice = calcOrigPriceByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcOrigPrice, priceTaxRateNumVO.getOrig_price())) {
            return R.fail("无税单价计算有误：" + "计算值[" + calcOrigPrice + "]" + "实际值[" + priceTaxRateNumVO.getOrig_price() + "]");
        }
        BigDecimal calcTaxPrice = calcTaxPriceByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTaxPrice, priceTaxRateNumVO.getTax_price())) {
            return R.fail("含税单价计算有误：" + "计算值[" + calcTaxPrice + "]" + "实际值[" + priceTaxRateNumVO.getTax_price() + "]");
        }
        BigDecimal calcTaxAmount = calcTaxAmountByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcTaxAmount, priceTaxRateNumVO.getTax_amount())) {
            return R.fail("含税金额计算有误：" + "计算值[" + calcTaxAmount + "]" + "实际值[" + priceTaxRateNumVO.getTax_amount() + "]");
        }
        BigDecimal calcTax = calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTax, priceTaxRateNumVO.getTax())) {
            return R.fail("税额计算有误：" + "计算值[" + calcTax + "]" + "实际值[" + priceTaxRateNumVO.getTax() + "]");
        }
        return R.ok();
    }

    /**
     * 通过[含税金额、数量、税率] 计算 [含税单价、无税单价、无税金额、税额]
     * @param priceTaxRateNumVO 价格信息VO【含税金额、数量、税率不能为空】
     * @return R
     */
    public R checkPriceByTaxAmount(PriceTaxRateNumVO priceTaxRateNumVO){
        if (ObjectUtil.isNull(priceTaxRateNumVO)) {
            throw new BizException("价格对象不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_amount())) {
            throw new BizException("含税金额不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getNnum())) {
            throw new BizException("数量不能为空");
        }
        if (ObjectUtil.isNull(priceTaxRateNumVO.getTax_rate())) {
            throw new BizException("税率不能为空");
        }
        BigDecimal calcTaxPrice = calcTaxPriceByTaxAmount(priceTaxRateNumVO.getTax_amount(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcTaxPrice, priceTaxRateNumVO.getTax_price())) {
            return R.fail("含税单价计算有误：" + "计算值[" + calcTaxPrice + "]" + "实际值[" + priceTaxRateNumVO.getTax_price() + "]");
        }
        BigDecimal calcOrigPrice = calcOrigPriceByTaxPrice(priceTaxRateNumVO.getTax_price(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcOrigPrice, priceTaxRateNumVO.getOrig_price())) {
            return R.fail("无税单价计算有误：" + "计算值[" + calcOrigPrice + "]" + "实际值[" + priceTaxRateNumVO.getOrig_price() + "]");
        }
        BigDecimal calcOrigAmount = calcOrigAmountByOrigPrice(priceTaxRateNumVO.getOrig_price(), priceTaxRateNumVO.getNnum());
        if (!NumberUtil.equals(calcOrigAmount, priceTaxRateNumVO.getOrig_amount())) {
            return R.fail("无税金额计算有误：" + "计算值[" + calcOrigAmount + "]" + "实际值[" + priceTaxRateNumVO.getOrig_amount() + "]");
        }
        BigDecimal calcTax = calcTaxByOrigAmount(priceTaxRateNumVO.getOrig_amount(), priceTaxRateNumVO.getTax_rate());
        if (!NumberUtil.equals(calcTax, priceTaxRateNumVO.getTax())) {
            return R.fail("税额计算有误：" + "计算值[" + calcTax + "]" + "实际值[" + priceTaxRateNumVO.getTax() + "]");
        }
        return R.ok();
    }

    /* ------------------------- 单独的价格计算--------------------------*/

    /* ------------------------- 无税单价的计算--------------------------*/

    /**
     * 无税单价 = 无税金额 / 数量 -> 保留六位小数
     * @param origAmount 无税金额
     * @param nnum 数量
     * @return 无税单价
     */
    public BigDecimal calcOrigPriceByOrigAmount(BigDecimal origAmount, BigDecimal nnum) {
        // 无税单价 = 无税金额 / 数量 -> 保留六位小数
        return NumberUtil.round(NumberUtil.div(origAmount, nnum), 6);
    }

    /**
     * 无税单价 = 含税单价 / (1 + 税率) -> 保留六位小数
     * @param taxPrice 含税单价
     * @param taxRate 税率
     * @return 无税单价
     */
    public BigDecimal calcOrigPriceByTaxPrice(BigDecimal taxPrice, BigDecimal taxRate) {
        // 无税单价 = 含税单价 / (1 + 税率) -> 保留六位小数
        return NumberUtil.round(NumberUtil.div(taxPrice, NumberUtil.add(taxRate, BigDecimal.ONE)), 6);
    }

    /**
     * 无税单价 = 辅助无税单价 / 换算系数 -> 保留六位小数
     * @param f_orig_price 辅助无税单价
     * @param scalefactor 换算系数
     * @return 无税单价
     */
    public BigDecimal calcOrigPriceByScalefactor(BigDecimal f_orig_price, BigDecimal scalefactor) {
        return NumberUtil.div(f_orig_price, scalefactor, 6);
    }

    /* ------------------------- 含税单价的计算--------------------------*/

    /**
     * 含税单价 = 含税金额 / 数量 -> 保留六位小数
     * @param taxAmount 含税金额
     * @param nnum 数量
     * @return 含税单价
     */
    public BigDecimal calcTaxPriceByTaxAmount(BigDecimal taxAmount, BigDecimal nnum) {
        // 含税单价 = 含税金额 / 数量 -> 保留六位小数
        return NumberUtil.round(NumberUtil.div(taxAmount, nnum), 6);
    }

    /**
     * 含税单价 = 无税单价 * (1 + 税率) -> 保留六位小数
     * @param origPrice origPrice
     * @param taxRate 税率
     * @return 含税单价
     */
    public BigDecimal calcTaxPriceByOrigPrice(BigDecimal origPrice, BigDecimal taxRate) {
        // 含税单价 = 无税单价 * (1 + 税率) -> 保留六位小数
        return NumberUtil.round(NumberUtil.mul(origPrice, NumberUtil.add(taxRate, BigDecimal.ONE)), 6);
    }

    /* ------------------------- 无税金额的计算--------------------------*/

    /**
     * 无税金额 = 无税单价 * 数量 -> 保留六位小数
     * @param origPrice 无税单价
     * @param nnum 数量
     * @return 无税金额
     */
    public BigDecimal calcOrigAmountByOrigPrice(BigDecimal origPrice, BigDecimal nnum) {
        // 无税金额 = 无税单价 * 数量 -> 保留六位小数
        return NumberUtil.round(NumberUtil.mul(origPrice, nnum), 6);
    }

    /* ------------------------- 含税金额的计算--------------------------*/

    /**
     * 含税金额 = 含税单价 * 数量 -> 保留六位小数
     * @param taxPrice 含税单价
     * @param nnum 数量
     * @return 含税金额
     */
    public BigDecimal calcTaxAmountByTaxPrice(BigDecimal taxPrice, BigDecimal nnum) {
        // 含税金额 = 含税单价 * 数量 -> 保留六位小数
        return NumberUtil.round(NumberUtil.mul(taxPrice, nnum), 6);
    }

    /**
     * 税额 = 无税金额 * 税率 -> 保留六位小数
     * @param origAmount 无税金额
     * @param taxRate 税率
     * @return 税额
     */
    public BigDecimal calcTaxByOrigAmount(BigDecimal origAmount, BigDecimal taxRate) {
        // 税额 = 无税金额 * 税率
        return NumberUtil.round(NumberUtil.mul(origAmount, taxRate), 6);
    }

    /**
     * 主数量 = 辅助数量 * 换算系数
     * @param f_num 辅助数量
     * @param scalefactor 换算系数
     * @return 主数量
     */
    public BigDecimal calcNnumByScalefactor(BigDecimal f_num, BigDecimal scalefactor) {
        return NumberUtil.mul(f_num, scalefactor);
    }
}
